package com.linsir.core.type;

import com.jfinal.core.converter.TypeConverter;
import com.linsir.model.MetaField;

import java.text.ParseException;
import java.util.Map;

/**
 * @author Administrator
 * @title: Convertor
 * @projectName linsir-mu
 * @description: TODO
 * @date 2021/12/2 0:13
 */

@SuppressWarnings("rawtypes")
public abstract class Convertor {

    /**
     * 数据库类型 <> Java类型
     * @return
     */
    public abstract Map<String, Class> mapping();

    /**
     * 数据类型强制转换
     * @param field 元字段
     * @param o 数据
     * @return
     */
    public abstract Object convert(MetaField field, Object o);

    /**
     *
     * 根据DB类型获取Java类型
     * @param field 元字段
     * @return
     */
    protected Class getJavaType(MetaField field) {
        String dataType = field.getDataTypeName();
        Class javaTYpe = mapping().get(dataType);
        if (javaTYpe == null)
            throw new RuntimeException(String.format("当前数据类型转换器无法匹配数据库字段类型:%s,请更换其它常用类型或自定义类型转换器", dataType));
        return javaTYpe;
    }

    /**
     * 数据转换规则
     * @param o
     * @param c
     * @return
     * @throws ParseException
     */
    protected Object rule(Object o, Class c) {
        if (o == null) {
            return null;
        }

        try {
            return TypeConverter.me().convert(c, o.toString());
        } catch (Exception e) {
            throw new RuntimeException(String.format("无法将值[%s]转换为[%s]" + o, c), e);
        }
    }
}
